package com.yifi.system.service;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.upload.UploadFile;
import com.yifi.common.IOHelper;
import com.yifi.common.utils.DateUtils;
import com.yifi.common.utils.FileUtils;
import com.yifi.common.utils.ImageUtils;

import cn.hutool.core.util.IdUtil;
import net.coobird.thumbnailator.Thumbnails;

public class UploadFileService {

	/**
	 * 
	 * @param response
	 * @param request
	 * @param filesList
	 * @return
	 * @throws IOException
	 */
	public static List<Record> uploadFile(HttpServletResponse response,
			HttpServletRequest request,List<UploadFile> filesList)
	{
		return uploadFile(response,request,filesList,"");
	}
	
	/**
	 * 	多文件上传
	 * @param response
	 * @param request
	 * @param filesList
	 * @param ctype
	 * @return
	 * @throws IOException
	 */
	public static List<Record> uploadFile(HttpServletResponse response,
			HttpServletRequest request,List<UploadFile> filesList,String ctype)
	{
		List<Record> list=new ArrayList<Record>();
		
		Map<String, String> fileMap = new HashMap<>();
		
		File file = null;
		for (UploadFile uploadFile : filesList) {
			Record recordFile=new Record();
			// 获取文件参数名长度
			Integer length = uploadFile.getParameterName().length();
			// 获取上传文件大小
			long size = uploadFile.getFile().length();
			// 重定义文件上传路径，Jfinal默认上传路径 + 商户文件夹+商户编号 + 参数名+参数名+图片文件后缀
			/*String path = uploadFile.getUploadPath() + FileUtils.getDatePath() +"\\"
					+ uploadFile.getParameterName().substring(0, length - 1) + "\\" + uploadFile.getParameterName()
					+ ".jpg";*/
			String fileext=uploadFile.getContentType();
			String paraname=uploadFile.getParameterName();	//传参数名
			String fileTname=uploadFile.getFileName();	//传的文件名
			String suffix = fileTname.substring(fileTname.lastIndexOf(".") + 1);

	        String text=DateUtils.parseDateToStr("yyyyMMddHHmmssSSS",DateUtils.getNowDate())
	        		+ctype+"("+fileTname.substring(0,fileTname.lastIndexOf("."))+")";
			String filename=text+"."+suffix;
			String datePath=FileUtils.getDatePath();
			String fpath= datePath +filename;
			String path = uploadFile.getUploadPath()+"/"+fpath;
			
			// 自定义路径
			file = new File(path);
			// 判断文件夹是否存在
			if (!file.getParentFile().exists()) {
				file.getParentFile().mkdirs();// 创建文件夹
			}
			// file文件存在则删除并执行上传，不存在则直接执行上传
			if (file.exists()) {
				// 删除旧文件
				file.delete();
			}
			uploadFile.getFile().renameTo(file);// 上传文件到指定位置
			HashMap<String,String> map=new HashMap<String,String>();
			if(suffix.contains("jpg")||suffix.contains("jpeg")||suffix.contains("png"))
			{
				// 判断图片是否大于1/4Mb 如果大于则压缩图片
				/*if (size > 1024 * 1024 / 4) {
					try {
						// 此处是谷歌图片按比例压缩方法
						Thumbnails.of(file).scale(0.25f).toFile(path);
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}*/
				
				/*InputStream input= new FileInputStream(file);
		        BufferedImage srcImg = ImageIO.read(input);
		        int width=srcImg.getWidth();
		        int height=srcImg.getHeight();
				input.close();
		        Font font =new Font("微软雅黑",Font.BOLD,30);
				ImgUtil.pressText(file, file,text,Color.RED, font,0,(height/2)-40,0.8f);*/
				//map = ImageUtils.getImgProp(file);
			}
			
			
			// 将图片路径放入到map集合
			fileMap.put(uploadFile.getParameterName(), path);
			
			recordFile.set("fid", paraname);
			recordFile.set("fname", fileTname);		//文件名称
			recordFile.set("fext", suffix);			//扩展名
			recordFile.set("furl", fpath);			//文件全路径
			recordFile.set("fsize",IOHelper.convertFileSize(size));			//文件大小
			recordFile.set("fdate",datePath);		//文件日期路径
			recordFile.set("fmap",map);		//文件属性
			
			list.add(recordFile);
		}
		return list;
	}
	/**
	 *  apk文件上传
	 * @param response
	 * @param request
	 * @param uploadFile
	 * @param ParentPath
	 * @return
	 */
	public static Record uploadFileApp(HttpServletResponse response,
			HttpServletRequest request,UploadFile uploadFile,String ParentPath)
	{
		
		Map<String, String> fileMap = new HashMap<>();
		
		File file = null;
		
		Record recordFile=new Record();
		// 获取文件参数名长度
		Integer length = uploadFile.getParameterName().length();
		// 获取上传文件大小
		long size = uploadFile.getFile().length();
		// 重定义文件上传路径，Jfinal默认上传路径 + 商户文件夹+商户编号 + 参数名+参数名+图片文件后缀
		/*String path = uploadFile.getUploadPath() + FileUtils.getDatePath() +"\\"
				+ uploadFile.getParameterName().substring(0, length - 1) + "\\" + uploadFile.getParameterName()
				+ ".jpg";*/
		String fileext=uploadFile.getContentType();
		String paraname=uploadFile.getParameterName();
		String fileTname=uploadFile.getFileName();
		String suffix = fileTname.substring(fileTname.lastIndexOf(".") + 1);
		
		String filename=IdUtil.fastUUID()+"."+suffix;
		String datePath=FileUtils.getDatePath();
		String fpath= ParentPath+"/"+datePath+filename;
		String path = uploadFile.getUploadPath()+"/"+fpath;
		
		// 自定义路径
		file = new File(path);
		// 判断文件夹是否存在
		if (!file.getParentFile().exists()) {
			file.getParentFile().mkdirs();// 创建文件夹
		}
		// file文件存在则删除并执行上传，不存在则直接执行上传
		if (file.exists()) {
			// 删除旧文件
			file.delete();
		}
		uploadFile.getFile().renameTo(file);// 上传文件到指定位置
		
		
		fileMap.put(uploadFile.getParameterName(), path);
		
		recordFile.set("fid", paraname);
		recordFile.set("fname", fileTname);
		recordFile.set("fext", suffix);
		recordFile.set("furl", fpath);
		recordFile.set("fsize",IOHelper.convertFileSize(size));
		recordFile.set("fdate",datePath);
			
		return recordFile;
		
	}

	/**
	 * 	单文件上传
	 * @param response
	 * @param request
	 * @param uploadFile
	 * @param ParentPath
	 * @return
	 */
	public static Record uploadFile(HttpServletResponse response,
			HttpServletRequest request,UploadFile uploadFile,String ParentPath)
	{
		
		Map<String, String> fileMap = new HashMap<>();
		
		File file = null;
		
		Record recordFile=new Record();
		// 获取文件参数名长度
		Integer length = uploadFile.getParameterName().length();
		// 获取上传文件大小
		long size = uploadFile.getFile().length();
		// 重定义文件上传路径，Jfinal默认上传路径 + 商户文件夹+商户编号 + 参数名+参数名+图片文件后缀
		/*String path = uploadFile.getUploadPath() + FileUtils.getDatePath() +"\\"
				+ uploadFile.getParameterName().substring(0, length - 1) + "\\" + uploadFile.getParameterName()
				+ ".jpg";*/
		String fileext=uploadFile.getContentType();
		String paraname=uploadFile.getParameterName();
		String fileTname=uploadFile.getFileName();
		String suffix = fileTname.substring(fileTname.lastIndexOf(".") + 1);
		
		String filename=IdUtil.fastUUID()+"."+suffix;
		String datePath=FileUtils.getDatePath();
		String fpath= ParentPath+"/"+datePath+filename;
		String path = uploadFile.getUploadPath()+"/"+fpath;
		
		// 自定义路径
		file = new File(path);
		// 判断文件夹是否存在
		if (!file.getParentFile().exists()) {
			file.getParentFile().mkdirs();// 创建文件夹
		}
		// file文件存在则删除并执行上传，不存在则直接执行上传
		if (file.exists()) {
			// 删除旧文件
			file.delete();
		}
		uploadFile.getFile().renameTo(file);// 上传文件到指定位置
		// 判断图片是否大于1/4Mb 如果大于则压缩图片
		/*if (size > 1024 * 1024 / 4) {
			try {
				// 此处是谷歌图片按比例压缩方法
				Thumbnails.of(file).scale(0.25f).toFile(path);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}*/
		// 将图片路径放入到map集合
		fileMap.put(uploadFile.getParameterName(), path);

		recordFile.set("path", path);
		recordFile.set("fid", paraname);
		recordFile.set("fname", fileTname);
		recordFile.set("fext", suffix);
		recordFile.set("furl", fpath);
		recordFile.set("fsize",IOHelper.convertFileSize(size));
		recordFile.set("fdate",datePath);
		
		return recordFile;
		
	}


	/**
	 * 	dae文件上传    models/2022-02/模型code/model.dae
	 * @param response
	 * @param request
	 * @param uploadFile
	 * @param daecode
	 * @return
	 */
	public static Record uploadFileDae(HttpServletResponse response,
									HttpServletRequest request,UploadFile uploadFile,String daecode)
	{

		Map<String, String> fileMap = new HashMap<>();

		File file = null;

		Record recordFile=new Record();
		// 获取文件参数名长度
		Integer length = uploadFile.getParameterName().length();
		// 获取上传文件大小
		long size = uploadFile.getFile().length();
		// 重定义文件上传路径，Jfinal默认上传路径 + 商户文件夹+商户编号 + 参数名+参数名+图片文件后缀
		String fileext=uploadFile.getContentType();
		String paraname=uploadFile.getParameterName();
		String fileTname=uploadFile.getFileName();
		String suffix = fileTname.substring(fileTname.lastIndexOf(".") + 1);

		String filename=fileTname;
		String datePath=DateUtils.parseDateToStr("yyyy-MM",DateUtils.getNowDate());
		String fpath= "models/"+datePath+"/"+daecode+"/"+filename;
		String path = uploadFile.getUploadPath()+"/"+fpath;

		// 自定义路径
		file = new File(path);
		// 判断文件夹是否存在
		if (!file.getParentFile().exists()) {
			file.getParentFile().mkdirs();// 创建文件夹
		}
		// file文件存在则删除并执行上传，不存在则直接执行上传
		if (file.exists()) {
			// 删除旧文件
			file.delete();
		}
		uploadFile.getFile().renameTo(file);// 上传文件到指定位置
		// 判断图片是否大于1/4Mb 如果大于则压缩图片
		// 将图片路径放入到map集合
		fileMap.put(uploadFile.getParameterName(), path);

		recordFile.set("path", path);
		recordFile.set("fid", paraname);
		recordFile.set("fname", fileTname);
		recordFile.set("fext", suffix);
		recordFile.set("furl", fpath);
		recordFile.set("fsize",IOHelper.convertFileSize(size));
		recordFile.set("fdate",datePath);

		return recordFile;

	}
	/**
	 * 	dae文件相关材质图片上传    models/2022-02/模型code/model/***.jpg
	 * @param response
	 * @param request
	 * @param filesList
	 * @param parentPath
	 * @return
	 */
	public static List<Record> uploadFileDae(HttpServletResponse response,
										  HttpServletRequest request,List<UploadFile> filesList,String parentPath)
	{
		List<Record> list=new ArrayList<Record>();

		Map<String, String> fileMap = new HashMap<>();

		File file = null;
		for (UploadFile uploadFile : filesList) {
			Record recordFile=new Record();
			// 获取文件参数名长度
			Integer length = uploadFile.getParameterName().length();
			// 获取上传文件大小
			long size = uploadFile.getFile().length();
			// 重定义文件上传路径，Jfinal默认上传路径 + 商户文件夹+商户编号 + 参数名+参数名+图片文件后缀

			String fileext=uploadFile.getContentType();
			String paraname=uploadFile.getParameterName();	//传参数名
			String fileTname=uploadFile.getFileName();	//传的文件名
			String suffix = fileTname.substring(fileTname.lastIndexOf(".") + 1);

			String filename=fileTname;
			String fpath= parentPath +filename;
			String path = uploadFile.getUploadPath()+"/"+fpath;

			// 自定义路径
			file = new File(path);
			// 判断文件夹是否存在
			if (!file.getParentFile().exists()) {
				file.getParentFile().mkdirs();// 创建文件夹
			}
			// file文件存在则删除并执行上传，不存在则直接执行上传
			if (file.exists()) {
				// 删除旧文件
				file.delete();
			}
			uploadFile.getFile().renameTo(file);// 上传文件到指定位置
			HashMap<String,String> map=new HashMap<String,String>();


			// 将图片路径放入到map集合
			fileMap.put(uploadFile.getParameterName(), path);

			recordFile.set("fid", paraname);
			recordFile.set("fname", fileTname);		//文件名称
			recordFile.set("fext", suffix);			//扩展名
			recordFile.set("furl", fpath);			//文件全路径
			recordFile.set("fsize",IOHelper.convertFileSize(size));			//文件大小
			recordFile.set("fdate","");		//文件日期路径
			recordFile.set("fmap",map);		//文件属性

			list.add(recordFile);
		}
		return list;
	}
}
